#include <main.h>

unsigned int onesec;
unsigned onesec_flag=0;
unsigned int secs=0;

#INT_TIMER2
void TIMER2_isr(void)
{
	onesec++;
	if(onesec==20) {onesec=0;onesec_flag=1;}
}

unsigned long i = 0 ; // Start countdown from 40

unsigned int seg(unsigned int num) {
    switch (num) {
        case 0: return 0x3F;
        case 1: return 0x06;
        case 2: return 0x5B;
        case 3: return 0x4F;
        case 4: return 0x66;
        case 5: return 0x6D;
        case 6: return 0x7D;
        case 7: return 0x07;
        case 8: return 0x7F;
        case 9: return 0x6F;
        default: return 0x00; // Invalid input
    }
}

void update_display(unsigned int number) {
    unsigned int digit;

    // Update the ones place on PORTC
    digit = number % 10;
    output_b(seg(digit)); // Send segment data to PORTC
    delay_ms(2);

    // Update the tens place on PORTB
    digit = (number / 10) % 10;
    output_c(seg(digit)); // Send segment data to PORTB
    delay_ms(2);
}

void clock(void)
{
	if(onesec_flag)
		{
			onesec_flag=0;
			secs++; if (secs==41){secs=0;}
		}
}	

void main() {
	setup_timer_2(T2_DIV_BY_16,240,13);		//1.9 ms overflow, 25.0 ms interrupt
	enable_interrupts(INT_TIMER2);
	enable_interrupts(GLOBAL);

    while (TRUE) {
		clock();
        update_display(secs);
		
		if(secs == 0)
		{
			output_low(pin_H2);
			output_low(pin_H1);
			output_high(pin_H0);
			output_low(pin_J2);
			output_low(pin_J1);
			output_high(pin_J0);
			output_low(pin_G2);
			output_low(pin_G1);
			output_high(pin_G0);
		}

		if((secs >=1) && (secs <= 4))
		{
			output_low(pin_H2);
			output_high(pin_H1);
			output_high(pin_H0);
		}
		if((secs >=4) && (secs <= 8))
		{
			output_high(pin_H2);
			output_low(pin_H1);
			output_low(pin_H0);

		}
		if((secs >=8) && (secs <= 10))
		{
			output_low(pin_H2);
			output_high(pin_H1);
			output_low(pin_H0);
		}
		if(secs>10)
		{
			output_low(pin_H2);
			output_low(pin_H1);
			output_high(pin_H0);
		}




		if((secs >=11) && (secs <= 14))
		{
			output_low(pin_J2);
			output_high(pin_J1);
			output_high(pin_J0);
		}
		if((secs >=14) && (secs <= 18))
		{
			output_high(pin_J2);
			output_low(pin_J1);
			output_low(pin_J0);
		}
		if((secs >=18) && (secs <= 20))
		{
			output_low(pin_J2);
			output_high(pin_J1);
			output_low(pin_J0);
		}
		if(secs>20)
		{
			output_low(pin_J2);
			output_low(pin_J1);
			output_high(pin_J0);
		}



		if((secs >=21) && (secs <= 24))
		{
			output_low(pin_G2);
			output_high(pin_G1);
			output_high(pin_G0);
		}
		if((secs >=24) && (secs <= 28))
		{
			output_high(pin_G2);
			output_low(pin_G1);
			output_low(pin_G0);
		}
		if((secs >=28) && (secs <= 30))
		{
			output_low(pin_G2);
			output_high(pin_G1);
			output_low(pin_G0);
		}
		if(secs>30)
		{
			output_low(pin_G2);
			output_low(pin_G1);
			output_high(pin_G0);
		}

    }
}

///////MAYBE USE INTERUPTS AS THE OVERALL 40 SECOUND COUNT DOWN SO THAT THE REST OF THE CODE CAN RUN INCLUIDNG ALL THE TRAFIC LIGHT SIGNALS